        Evolutio-ohjelman synty

11.5.89 Scientific American-lehti saapuu.
        Luen ekaksi "Computer Recreation" artikkelin. Juttu esitt
        ohjelmaa, jossa "kirput" syvt pikku "baktereita" ja kehittyvt
        mutaatioiden kautta tehokkaammin liikkuviksi.
        Kun kirppu on synyt kyllikseen se saa luvan jakautua.
Syntyvt kaksi kirppua, ja niiden geenit muuttuvat samalla yhdess
kohdassa. Vitsi on siin, ett satunnaisesti liikkuvien olioiden
satunnaisesti muuttuvan perim-aineksen kautta kehittyvt lajikkeita,
jotka liikkuvat olosuhteisiin nhden tehokkaammin, lytvt enemmn
rehua ja lisntyvt yh nopeammin.
Ohjelma on askel Richard Dawkinsin viittoittamalla tiell kohti
tietokonesimulaatiota, joka kuvaa elmn kehityst maapallossa.

12.5.89 Otan lehden mukaan tihin ja kirjoitan muistiin joitakin
suunnitelmia. Laitan yls, minklaisia muuttujia ja taulukkoita
tarvitaan ja yritn mietti joitakin rutiineja.
Artikkelissa oli esitetty monimutkainen tapa liikuttaa kirput
todennkisyyden mukaan. Kirpuilla on kuusi geeni, joiden nimet
ovat ETEEN OIKEALLE JYRKSTI-OIKEALLE VASEMMALLE JYRKSTI-VASEMMALLE
sek TAAKSE.
Muutaation kautta ne joko vahvistuvat tai heikkenevt, jolloin kirppu
alkaa suosia liikkeissn tiettyj suuntia toisten suuntien kustannuksella.
Geenien arvo voi olla positiivinen tai negatiivinen kokonaisluku.
Laskentakaavaan sisltyy sek potenssilaskua ett reaalikukuja.
Yritn vltt nit ja ptn kokeilla ainakin aluksi sellaisia
geenia, jotka ovat kaikki positiivisia. Pienempi kuin nolla ei geeni
voi olla. Geeni-arvojen summa on sitten raja-arvo, jota tarvitaan
satunnaisfunktion kanssa.
Illalla koneella: Forth-editorissa ensimmiset screenit, jossa
muuttujat ja datapuskurit ynn sanat, joilla saadaan alkutilanne
kuvaruudulle. VDI-rutiineista ptn kytt MARK-funktiota, jolla tehdn
pisteit sek plus-merkkej. Kirjoitusmuoto XOR, jolloin voi kirjoittaa
merkkej pllkkin aikaisempia tuhoamatta.
On tarkoin mietittv, miss formaatissa aion kytt eri lukuja, riittk
jossain tapauksessa tavu, vai tarvitaanko sana tai tupla.

13.5.89 Yll tuli maistettua vhn kuohuviini, ja pnsrky nytt
vistmttmlt. Aspiriini auttaa.
Ohjelmoimaan: mietin jonkun aikaa, voisinko kytt kaikille kirppuille
yhteisen puskurin, jonka ensimminen sana olisi kirppujen lukumr,
sen jlkeen x1, y1, x2, y2 ... Silloin VDI-MARK voisi kirjoittaa
merkit yhdell kutsulla. Ptn kuitenkin valmistaa yhden, kolmen sanan
"marks"-puskurin, jonka eka sana on 1 ja johon nostetaan x- ja y-koordinaa-
tit yksitellen. Silloin voin antaa eri kirppuille eri vrit.
Myhemmin osoittautuu menetelm oikeaksi: kirppujen koordinaatit
pit silytt pitkin sanoina (kahdeksan tavua = x ja y).
Silloin voi ilmaista mys negatiivisia arvoja, kun kirppu liikkuu
rajan yli.
Esimerkiksi liikkeell syntyy x-arvo -2. Listn siihen 320 ja 
lasketaan modula 320, josta syntyy 318. Silloin kirppu ilmestyy
oikealla reunalla. 
Taulukoissa silytetn koordinaatit sopivasti matalaa resoluutiota
varten, ja muille resoluutioille muutetaan ne sopivaksi kyttmll
muuttujia xres ja yres. Oikeastaan olisi vltettv kyttmst
XBIOSin GETREZi, koska se ei tunnista suurempaa resoluutiota kuin
640*400 pistett. Esim. BIGSCREENi varten olisi silytettv
ohjelman kynnistyksen yhteydess suoritetun OPEN WORKSTATION-funktion
antama resoluutio-arvot. En osaa sit viel, joten tm ohjelma ei
tule olemaan yhteensopiva BIGSCREENin kanssa.


Koko jupakasta syntyy kuitenkin pieni sekaannus rutiineissa.
Kun psen kokeilemaan kirppujen liikkumista, huomaan, ett merkkien
poisto ja siirtminen ei oikein luonnistu. XOR-muodossahan pitisi
onnistua merkin poisto kirjoittamalla se uudestaan samalle paikalle,
mutta jostain syyst ensimmiset merkit jvt paikalle.
Onnistun kiertmn ongelmaa, mutta vasta illalla lydn syyn.

Forth on konelheinen kieli, mik tarkoittaa, ett kytetn paljon
funktioita, jotka suoraan kyvt muistin kimppuun.
X-y-koordinaateja varten on varattu puskuri, jonka tilavuus on 800 tavua.
Olen pttnyt rajoittaa kirppujen maksimin sataan, ja 8 tavua tarvitaan
jokaista kohden.
Kun ksittelee ensimmist kirppua, on sen numero =0.
Numero on kerrottava 8:lla, jotta saadaan luku, johon listn puskurin
alkuosoite. Siten saadaan se muistiosoite, jossa kirpun X-arvo makaa.
Lismll edelleen 4 saadaan Y-arvon paikkaa.
Sekaannus aiheutti se, ett joissain rutiineissa olin kyttnyt 
8:n tilalla 4:a. Fuzzy logic kuten aina!
Illalla saan ohjelman siihen pisteeseen, ett kirput liikkuvat iloisesti,
syvt rehupisteit ja niiden ruokavarasto joko kasvaa tai vhenee.
Kun varasto loppuu, kirppu kuolee eli hipyy kuvaruudusta ja muistista.

Vlill oli ratkaistava, miten estetn kirppujen liian nopea nlkkuolema.
Pit olla alussa paljon rehua, vaikka 8000 pistett, ja sydessn
kirppu saa 80 pistett per rehulyty. Turha liike vie 2 pistett.
Sytty pistett kohti piirretn jonnekin uusi.
Nin onnistuu suunnilleen ohjelman tarkoitus: kirput saavat tilaisuuden
lisnty.
Itse lisntymisprosessi ja mutaatiot jvt itienpivn ratkaistavaksi.   

14.05.89 Tass syntyi univajausta lis, mutta jo puoli kymmenelt taas
ohjelman kimppuun.
Ensin pit kuolleen kirpun jnnkset pyyhki pois puskureista, siis
kuolleen kohdalla siirretn puskurin loppu tietyn mrn
tavuja eteen. 
Sen jlkeen se lisntyminen! Raja-arvoksi otan 1500 pistett, jos kirppu
on synyt enemmn se jaetaan. COPY-GENE kopioi ensin geenit tyhjlle
paikalle, jonka osoittaa muuttuja LASTBUG. 
MODIFY-sana muuttaa sek uuden ett vanhan kirpun geenej yhdess kohdassa.
Sitten kirjoitetaan uudelle tulokkaalle muut tiedot eri puskureihin ja
korotetaan LASTBUG-muuttuja yhdell.
Koeajalla tulee kaksi pommia. Jten seuraavalla kerralla DIVIDE?-sanan
kntmtt, joka ohjaa koko lisntymisprosessin. Kirput liikkuvat 
iloisesti, kaikki hyvin. Tiedn ett muu ohjelma on kunnossa.
Nyt on lydettv kohta, jossa tehdn jotain kielletty.
Ensin huomaan, ett MODIFY-rutiinin pinoksittely oli virheellinen, 
mutta korjauksen jlkeenkin tulee pommeja!
Lopuksi lytyy aiheuttaja: tietenkin kirjoitusvirhe. Kun olisi pitnyt
inkremoida LASTBUG nin:

        1 lastbug +!

siin luki  1 lastbug @ +!

Eli @ lukee LASTBUG-muuttujan arvon, joka voi olla 0-99. 
Lastbug-muuttuja sijaitsee muistipaikassa noin 300000.
Jos kytt +! -funktiota muistin alkuosoitteilla, joka on kielletty
USER-modessa, ei tarvitse ihmetell, jos kone kaatuu.

Nyt kaikki nytt aluksi hyvlt. ASCII 7 merkki sanoo pling!
joka kerta kun kirppu jakautuu. Mutta miksi jossain hvi pisteet
vaikkei kirppuja ny?
Nkymttmt kirput ovat tietysti ne uudet, vastasyntyneet.
Synnytyksen jlkeen pit kerran kirjoittaa plus-merkki, muuten
kirppu on vain hyvin lyhyen ajan nkyviss, silloin kun sit tarkastellaan
silmukassa, joka liikuttaa kirput.
Edelleen kirput kuolevat jossain vaiheessa sukupuuttoon.
Viime iltana ohjelma ji siin vaiheessa, kun kuolleet kirput jivt
"makaamaan" kuvaruudussa. Ja viel elossa olevat tietysti kanibalisoivat
niiden pikselit. Musta piste on musta piste. En tied pitk tm
jtt nin, todellisessa luonnossahan kvisi samoin, kaikki ruoka
kelpaa jollekin oliolle.
Ents jos ohjelman ajon aikana kehittyisi sellainen laji, joka 
seuraisi muita kavereita ja sisi ne?

WATOR-ohjelmassa (saalis ja peto) oli peto ohjelmoitu katsomaan ensin
kaikkiin suuntiin ja liikkumaan vain sinne miss on ruokaa. Sen
seurauksena pedot lisntyivt rajusti kunnes saalis ky vhiin, jonka
jlkeen suurin osa pedoista menehtyi. Saaliin lisntyminen oli 
riippumatta saaliin lukumrst.
Mutta kun EVOLUTIOssa pidetn saaliin lukumr vakiona, voisi
ehk antaa kirppuille silmt eli kyky havaita ruokaa lheisyydess.
Pit kokeilla kun ensin saadaan kaikki toimimaan.

Iltapivll ohjelma toimii jotenkuten, mutta jotain edelleen vaivaa.
Luen kirjaa, nukun, laitan ruokaa. Sitten tv:st hieno Lolita-elokuva.
Uutisten jlkeen asiat ovat mieless kypsyneet.
Otan MOVEBUG-silmukasta lisntymisrutiini pois ja teen sille oman
silmukan. Siis ensin liikutaan kaikki kirput uusiin paikkoihin,
sen jlkeen katsotaan, ketk ovat jakautumisvaiheessa.
Tm auttaa. Kun silmukan keskell muutettiin puskureita menivt eri
parametrit sekaisin.
Mutta alussa, asettaessaan rehupisteet, tapahtuu viel kummia.
Kun tarkkoin katsoo nkee ett vlill pisteit hvi!
Siksi ruoka ei tahtonut koskaan riitt.
Virhe oli vaikea lyt. Kun asetetaan uusi piste, suoritetaan ensin
silmukka, jossa arvotaan satunnaislukuja koordinaateiksi ja katsotaan,
onko siin paikassa jo ennestn piste (vdi get-pixel).
Mutta siin unohtui resoluutiokertoimet xres ja yres.
Kun korjaan tmn riitt jo paljon vhemmin rehua, koska mitn ei
en kirjoiteta yli.
Nyt kirput lisntyvt niin nopeasti, ett tulee taas pommeja!
Koska puskurit riittvt vain sadalle kirppuille menee lopuksi raja
rikki ja data kirjoitetan ohjelmakoodin yli, josta prosessori ei
pid.
Yksinkertainen if - endif - lause korjaa asian.
Ohjelma yksinkertaisessa muodossa on sitten valmis, mutta evoluutiosta
ei ole viel merkkikn.
Rehun mrn st, ja ennen kaikkea pit est ett kirput syvt
toisiaan, mik sotkee olosuhteet. On luultavasti kytettv toinen,
nkymtn ruutu, josta kirput etsivt rehut, jolloin kirppuja esittvt
merkit eivt hiritse.

Ja on tehtv mahdolliseksi, ett vlill voi hiirell valita 
yksittis kirppuja ja tarkistaa niiden geeni-tietoja.

15.05.89  On vain puolisen tuntia aikaa. Kokeilen toisen kuvaruudun
kytt. XBIOSin funktio SETSCREEN siirt kuvaruudun RAM-muistin
paikasta toiseen. Tss vaihdetaan vain looginen kuvaruutu silloin kun
halutaan tiet onko tietyss paikassa rehu-pikseli vai ei.
Ja resoluutioksi annetaan -1, mik tarkoittaa ettei resoluutiota muuteta.
Jos antaa positiivisen arvon XBIOS suorittaa kuvaruudun pyyhkisyn, 
mik tss ei ole tarkoituksenmukaista. 
Minulla on sanat HINTEN ja VORNE, joita on sijoitettava eri silmukkoihin
jrkevsti. Sekaannusta syntyy tietysti, mutta on pakko lopettaa.

16.05.89  Tyn jlkeen heti jatkoon. Muutaman koeajon jlkeen kuvaruudun
vaihdot tsmvt, ja rehupikselit sijoitetaan oikein molemmille ruuduille.
Olen pivll miettinyt, miten voisin helposti toteuttaa yksittisen
kirpun esittelyn. 
On kuusi geeni ja kuusi liikkumissuuntaa. Eripitoisia nuoleja
geeniarvon mukaan. Mutta siihenhn voisi kytt VDI-PIE-funktiota!
0-geenille sektori 200-400, 1-geenille 800-1000 ...
Se on ainakin nopea. Tulostus kolmannelle kuvaruudulle.
Ja silmukkaan tarkistus, onko vasen hiirikorva alhaalla. Hiirikursori
esiin, odotus kunnes hiirikorva on vapaa. Sitten vertaillaan, mik
kirppu oli kursorin lheisyydess. Tmn numeron lydetty
piirretn geenithti ja odotetaan, kunnes kyttj painaa oikeaa
hiirikorvaa.
Samalla korjataan joitakin pieni bugeja, jonka jlkeen ohjelma
on jo hyvss mallissa. 
Tarvitaan seuraavaksi ohjaus- ja st-rutiineja, ja olisi pstv
olosuhteisiin joissa todella evoluutio voi tapahtua.
Kyttjn on voitava mrt rehun mr sek kirppujen lhtgeenit
sek ohjelman uudelleenkynnistys ja lht desktopiin.

17.05.89 Katson vanhoista ohjelmistani mallia miten valikon ja muuttujien
editoinnin voi toteuttaa. Forth ST:n GEM-kirjastoja kytten asia ky
nopeasti. Laatikon sislle lyhyit selityksi sek radio-nappuloita
hiirell laukaistaviksi. Editointi-laatikon arvojen lukemiseksi eli
lukujen muuttamiseksi merkkijonoista kokonaisluvuiksi pit kyht
pikku rutiini ja testata se. Suunnittelen laatikot heti kaikille
resoluutioille sopiviksi, siksi ne ovat mustavalkomonitorissa
vasemassa ylnurkassa. Pasia on toimivuus.

18.05.89 Pienen pnvaivan aiheuttaa valikkonappuloiden vrivaihdos.
GEM knt hiiren klikkaaman nappulan mustaksi eli knteiseksi.
Siksi se pysyykin eli jos klikkaan vaikka EDIT-nappulaa se on edelleen
knteinen kun sama valikko tulee uudestaan esille. Seuraan
konekielimonitorilla mit tapahtuu ja lydn ne kohdat, jossa bitit
kntyvt. Lopussa, kiitos, seisoo! kuten Lyyli asian ilmaisee.
Siirrn valikko-koodit muuhun ohjelmaan. Tst lhtien on ladattava
mukaan mys GEM-kirjastot = 24 screeni.
Ohjelma koekytss. Kaikki nytt hyvlt. Ei voi olla totta!
Jten kirput pyrimn ja lhden Taskumatille yhdelle kaljalle.
Kun palaan ovat kirput kuolleet, bakteerit ovat kaikki keskittyneet
ruudun vasempaan ylempn neljnnekseen ja kone ei reagoi en mihinkn.
Pois plt ja nukkumaan.

19.05.89 Katson ohjelman koodia ja havaitsen trkeit epkohtia.
Uudet bakteerit tulevat vain mv-monitorin kuvaruudun neljnnekseen,
koska xres- ja yres-muuttujat jivt pois jostain. Virheit lytyy nyt
oikein paljon. Lopetan kannibalismin, kuolleet kirput hipyvt kuvasta.
Kuolleitten poisto muistista siirretn omaan silmukkaan.
Ensin liikutetaan kaikki kirput, sitten katsotaan, kuka niist sy,
ketk kuolevat. Kuolleet merkataan yls. Sitten poistetaan kuolleet
kijoista. Ja katsotaan, painoko joku hiirinappuloita. Sitten taas
liikutetaan...

: move-once move-each
            look-for-births
            look-for-deaths
            look-at-mouse ;

Jokaisessa oma silmukka, nyt ohjelman on koodin osalta siisti. Ei saa
yritt mahtumaan liikaa yhteen sanaan.

Alussa hylksin reaalilukujen kytn. Nyt on mietittv uudestaan
geenien vaikutus liikkumiseen.
Jokaisen kirpun geenin arvo on ohjelman alussa 4. Summaksi tulee 24.
Saadaan satunnaisluku vlilt 0 ja 23. Sitten katsotaan, mihin
viipaleeseen tm luku osuu. Esimerkiksi jos luku on 0-3 niin liikkutaan
eteen eli muutos on 0. 4-7 tarkoittaa oikeaan eli muutos = 1.
Jokaisella geenilla on kuudesosan todennkisyys tulla vuoroon.
Seuraavassa sukupolvessa geenijakautuma voi olla 445444 tai vaikka
434444. Summaksi tulee silloin 25 tai 23. Tm on aika pieni muutos
eik vaikuta juuri ollenkaan liikkumiskyttytymiseen.
Jospa muutan asian niin ett kytn geenien neliit?
Kun silloin geeni muuttuu 4:st 5:ksi muutos on laskennallisesti
16:sta 25:ksi. Jolloin mutaation vaikutus korostuu.

Nyt pstn vhitellen kokeilemaan ohjelmaa, samoin kuin ajantarve 
kasvaa. Ehk on odotettava tuntikausia kunnes parametrien vaikutukset
nkyvt.
Seuraava kuukausilehti olisi saatava kuntoon.

21.05.89  Yn aikana kirput saivat hyppi vapaasti. Aamulla niit on
sata kappaletta ja pistemrt jopa 22000:luokkaa! 
Tm ei toimi. On saatava vlill aikaan ruoan puute, jota huonoimmin
sopeutuneet kirput ehtisivt menehty. Thn saakka on aina asetettu
uusi bakteeri kun jossain yksi tuli syty pois. Nyt ky niin, ett
joka MOVE-ONCE-syklin ptteeksi asetetaan yksi uusi bakteeri, katsomatta
kuinka monta on syty pois. Siin toivossa ett hillitn kirppujen
lisntyminen loppuisi paikallisen ruokapulan vuoksi.

Se toimii! Join yhden tuopin kapakassa ja sen aikana on kirppujen liikku-
miskyttytyminen silmiinpistvsti muuttunut. Liikkuvat pitki jaksoja
yhteen suuntaan, lisntyvt vlill nopeasti, kuolevat sitten lhes
sukupuuttoon jne. Ja kaikissa on ETEEN-geeni kasvanut huomattavasti.


22.05.-24.05.89 Teen sporaadisesti tyt ohjelman parantamiseksi.
Kun tiedn ett se toimii kiinnostus alkaa laantua. Kirjoitan viel
rutiinin INFO.TXT-tiedoston lataamiseksi ja nyttmiseksi, mik osoittautuu
helpoksi. Kun kirput kuolevat sukupuuttoon ohjelma pysytetn hlytys-
laatikon kera. Ohjelma alkaa olla valmis. Evoluutio tapahtuu, mikli
valitaan sopivat olosuhteet. En aio paljastaa mitk ne ovat, mutta
optimi lytynee oletusarvojen lhelt.
Lopuksi viel mahdollisuus listata kaikki geenit taulukon muodossa,
aina 20 kirppua kerrallaan.
Onkohan Scientific American-lehden esitetty PC-ohjelma yht helppo-
kyttinen? Hinnaksi ilmoitettiin 39.95 taalaa.

Atari=Ammattimainen ja TApaRIkollisuus! (Helsingin Sanomat 28.05.89)




